/* PerformanceMonitorBeanDefinitionDecorator.java
*
* Copyright 2009-2015 Comcast Interactive Media, LLC.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.fishwife.jrugged.spring.config;
import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.xml.BeanDefinitionDecorator;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Attr;
import org.w3c.dom.Node;
/**
* This class is invoked when Spring encounters the jrugged:perfmon attribute.
* If the attribute is set to true, then it registers a BeanNameAutoProxyCreator
* that gets associated with the SingleServiceWrapperInterceptor created by
* the jrugged:methods attribute.
*/
public class PerformanceMonitorBeanDefinitionDecorator implements
BeanDefinitionDecorator {
/**
* Method called by Spring when it encounters the jrugged:perfmon attribute.
* Checks if the attribute is true, and if so, it registers a proxy for the
* bean.
*/
public BeanDefinitionHolder decorate(Node source,
BeanDefinitionHolder holder,
ParserContext context) {
boolean enabled = getBooleanAttributeValue(source);
if (enabled) {
registerProxyCreator(source, holder, context);
}
return holder;
}
/**
* Gets the value of an attribute and returns true if it is set to "true"
* (case-insensitive), otherwise returns false.
*
* @param source An Attribute node from the spring configuration
*
* @return boolean
*/
private boolean getBooleanAttributeValue(Node source) {
Attr attribute = (Attr)source;
String value = attribute.getValue();
return "true".equalsIgnoreCase(value);
}
/**
* Registers a BeanNameAutoProxyCreator class that wraps the bean being
* monitored. The proxy is associated with the PerformanceMonitorInterceptor
* for the bean, which is created when parsing the methods attribute from
* the springconfiguration xml file.
*
* @param source An Attribute node from the spring configuration
* @param holder A container for the beans I will create
* @param context the context currently parsing my spring config
*/
private void registerProxyCreator(Node source,
BeanDefinitionHolder holder,
ParserContext context) {
String beanName = holder.getBeanName();
String proxyName = beanName + "Proxy";
String interceptorName = beanName + "PerformanceMonitorInterceptor";
BeanDefinitionBuilder initializer =
BeanDefinitionBuilder.rootBeanDefinition(BeanNameAutoProxyCreator.class);
initializer.addPropertyValue("beanNames", beanName);
initializer.addPropertyValue("interceptorNames", interceptorName);
BeanDefinitionRegistry registry = context.getRegistry();
registry.registerBeanDefinition(proxyName, initializer.getBeanDefinition());
}
}